<?php
namespace app\admin\controller;
use app\admin\controller\Common;
use think\Request;
use think\Session;
use app\admin\model\Fillblank as Fblank;
class Fillblank extends Common
{
    public function add()
    {
        if(Request::instance()->isGet()){
            $id = Request::instance()->param('id');
            if($id){
                $choice = Fblank::get($id);
                $this->assign("cdata",$choice);
                return $this->fetch('edit');
            }else{
                return $this->fetch();
            }
        }
    }

    //添加填空题
    public function doAdd(){
    	header('content-type:text/html;charset=utf-8');
    	if (Request::instance()->isPost()) {
    		$data = Request::instance()->post();

    		if($data['id']){
                //修改
                $choice = new Fblank();
                $result = $choice->save($data,['id' => $data['id']]);
                if($result){
                    $this->success('更新成功','Question/qlist');
                }else{
                    $this->error('更新失败');
                }
            }else{
                //新增
                //检测填空题的标题是否满足条件
                if ($data['title']) {
                    $title = strip_tags($data['title']);
                    $firstl = strpos($title, '[');
                    $firstr = strpos($title, ']');
                    if ($firstl !== false && $firstr !== false) {
                        if ($firstl < $firstr) {
                            //取出第一个空
                            $len = $firstr - $firstl + 1;
                            $firstanswer = substr($title,$firstl,$len);
                            $newtitle = str_replace($firstanswer,'____',$title);//题目

                            $sdata['answer'] = substr($title,$firstl+1,$len-2);
                            $sdata['title'] = $newtitle;
                        }else{
                            $this->error('请正确的描述题干');
                        }
                    }else{
                        $this->error('请正确的描述题干,需要填空的地方用[]');
                    }
                }else{
                    $this->error('题干不能为空');
                }
                $sdata['creater'] = Session::get('id');
                $sdata['degree'] = $data['degree'];
                $sdata['analysis'] = $data['analysis'];
                $sdata['score'] = $data['score'];
                $sdata['category'] = $data['category'];
                $fbalnk = new Fblank;
                $fbalnk->data($sdata);
                if ($fbalnk->save()) {
                    $this->success('添加成功','Index/index');
                }else{
                    $this->error('添加失败');
                }
            }
    	}else{
    		$this->error('请求不合法');
    	}
    }

    //处理题干需要填空的信息
    //$title 要处理的题干字符串
  //   public function answerDo($title){
  //   	$title = strip_tags($title);
		// $firstl = strpos($title, '[');
		// $firstr = strpos($title, ']');
		// $answerarr = [];
		// $titlearr = [];
		// // dump($title);
		// // dump($firstl);
		// // dump($firstr);
		// if ($firstl !== false && $firstr !== false) {
		// 	// dump('------------');
		// 	if ($firstl < $firstr) {
		// 		//取出第一个空
		// 		$len = $firstr - $firstl + 1;
		// 		$firstanswer = substr($title,$firstl,$len);
		// 		$answerarr[] = $firstanswer;
		// 		$newtitle = str_replace($firstanswer,'____',$title);
		// 		// dump($len);
		// 		// dump($firstanswer);
		// 		// dump($newtitle.'--');
		// 		$titlearr[] = $newtitle;
		// 		$titlearr[] = $answerarr;
		// 		$this->answerDo($newtitle);
		// 	}else{
		// 		$this->error('请正确的描述题干');
		// 	}
		// }else{
		// 	return $titlearr;
		// }	
  //   }
  //   
     /**
     * 随机获取指定数量的填空题
     * @access public
     * @param $num 数量
     * @param $degree 难度
     * return string
     */
    public static function getFill($num,$degree=null){
    	$fillid = '';
    	$idarr = self::getValueByColumn('id',$degree);
    	//除了指定难度的试题的数量
	    $idarrno = self::getValueByColumnRe('id',$degree);
    	$idarrnum = count($idarr);//指定难度试题数量
		$bkey = count($idarrno)-1;
    	if ($idarrnum > 0) {
    		# 有该难度的试题 
    		if ($num > $idarrnum) {
    			# 难度试题不够
    			$fillidarr = [];//把或者试题放进去 然后打乱顺序
		    	//符合难度的试题
		   		$allnum = $idarrnum-1;
		    	$allnumarr = range(0,$allnum);//利用range()函数产生一个数组
			    shuffle($allnumarr);//利用shuffle()函数将产生的数组随机打乱顺序
		    	for ($i=0; $i < $idarrnum; $i++) {//选取数组
		        	$fillidarr[] = $idarr[$allnumarr[$i]];
		   		}
		   		//补得不符合难度的试题
		   		$diff = $num - $idarrnum;//需要补充的试题数量 5-3=2
		   		$allnumarra = range(0,$bkey);//利用range()函数产生一个数组
		    	shuffle($allnumarra);//利用shuffle()函数将产生的数组随机打乱顺序
				for ($i=0; $i < $diff; $i++) {//选取数组
					$index = $allnumarra[$i];
		        	$fillidarr[] = $idarrno[$index];
		   		}
		   		
		   		shuffle($fillidarr);
		   		$fillid = implode(',',$fillidarr);
    			
    		}else{
				$allnum = $idarrnum-1;
		    	$allnumarr = range(0,$allnum);//利用range()函数产生一个数组
			    shuffle($allnumarr);//利用shuffle()函数将产生的数组随机打乱顺序
			    for ($i=0; $i < $num; $i++) {//选取数组前5个，即随机 
			        $fillid .= $idarr[$allnumarr[$i]].',';
			    }
    		}
    	}else{
    		//没有该难度的试题
	    	$allnumarr = range(0,$bkey);//利用range()函数产生一个数组
		    shuffle($allnumarr);//利用shuffle()函数将产生的数组随机打乱顺序
	    	for ($i=0; $i < $num; $i++) {//选取数组
	        	$fillid .= $idarrno[$allnumarr[$i]].',';
	   		}
    	}
    	
	    return trim($fillid,',');
    }
     /**
     * 查询指定类型的指定难度的试题的数量
     * @access public
     * @param $category 类型
     * @param $degree 试题难度
     * return string
     */
    public static function getCount($degree=null){
    	$map = [];
    	$map['creater'] = Session::get('id');
    	if (!empty($degree)) {
    		$map['degree'] = $degree;
    	}
    	$num = Fblank::where($map)->count();
    	return $num;
    }
    /**
     * 查询指定类型的指定难度的试题的id值
     * @access public
     * @param $degree 试题难度
     * @param $column 列名
     * return string
     */
    public static function getValueByColumn($column,$degree=null){
    	$map = [];
    	$map['creater'] = Session::get('id');
    	if (!empty($degree)) {
    		$map['degree'] = $degree;
    	}
    	$idarr = Fblank::where($map)->column($column);
    	return $idarr;
    }
    /**
     * 查询指定类型的不等于指定难度的试题的id值
     * @access public
     * @param $degree 试题难度
     * @param $column 列名
     * return string
     */
    public static function getValueByColumnRe($column,$degree){
    	$map = [];
    	$map['creater'] = Session::get('id');
    	if (!empty($degree)) {
    		$map['degree'] = ['<>',$degree];
    	}
    	$idarr = Fblank::where($map)->column($column);
    	return $idarr;
    }
    /**
     * 预览
     * @access public
     * return array
     */
    public function preview(){
        if(Request::instance()->isGet()){
            $id = Request::instance()->param('id');
            $choice = Fblank::get($id);
            $this->assign("cdata",$choice);
            return $this->fetch();
        }else{
            $this->error('请求不合法');
        }
    }
    /**
     * 删除试题
     * @access public
     * return bool
     */
    public function delFill(){
        if(Request::instance()->isGet()){
            $id = Request::instance()->param("id");
            if($id){
                $choice = Fblank::get($id);
                if($choice){
                    if($choice->paperid){
                        return $this->error("试题存在试卷,不能删除");
                    }else{
                        if(Fblank::destroy($id)){
                            return $this->success("删除成功",'Question/qlist');
                        }else{
                            return $this->error("删除失败");
                        }
                    }
                }else{
                    return $this->error("要删除的数据不存在");
                }
            }else{
                return $this->error("参数错误");
            }
        }else{
            return $this->error("请求方式错误");
        }
    }
    /**
     * 取出指定id的数据
     * @access public
     * @param string
     * return array
     */
    public static function getInfoById($ids){
        if($ids){
            $single = new Fblank();
            $data = $single->getInfoByIds($ids);
            return $data;
        }else{
            return false;
        }
    }
}
